package com.goodboys.service.impl;

import com.goodboys.base.entity.BaseReqBean;
import com.goodboys.base.service.impl.BaseServiceImpl;
import com.goodboys.entity.LngLat;
import com.goodboys.entity.User;
import com.goodboys.service.UserService;
import com.goodboys.utils.*;
import com.qiniu.common.QiniuException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
 * Created by CJ on 2018-05-19.
 */
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    /**
     * 保存用户
     * @param user
     * @return
     * @throws Exception
     */
    @Override
    public Map register(User user) throws Exception {
        Map map = new HashMap();map.put("status", 0);
        if(user != null && user.getPhone() != null && user.getName() != null
                && PhoneFormatCheckUtils.isPhoneLegal(user.getPhone())
                && !StringUtils.isEmpty(user.getPwd())){
            if (user.getPwd().length() < 6) {
                map.put("message", "密码长度小于6位，请重试。。。");
            }else {
                //判断用户是否存在
                Integer exist = userDao.isExist(user.getPhone());
                if (exist > 0){
                    map.put("message", "用户已存在，请修改手机号注册。。。");
                    logger.error("ERROR====>register:"+user.getPhone()+"==用户已存在，请重新注册。。。");
                    return map;
                };
                //保存用户
                String id = UUID.randomUUID().toString().replaceAll("-","");
                user.setId(id);
                user.setPwd(Md5Utils.getMD5Code(user.getPwd()));
                user.setUpdateTime(new Date());
                userDao.insertSelective(user);

                //获取刚刚插入的user对象
                user = userDao.selectByPrimaryKey(user);

                map.put("status", 1);
                user.setPwd(null);
                map.put("message", user);
            }

        }else {
            map.put("message", "参数存在为空或者不合法。。。");
            logger.error("ERROR====>register:"+user.getPhone()+"==参数存在为空或者不合法。。。");
        }
        return  map;
    }

    /**
     * 用户登录
     * @param user
     * @return
     * @throws Exception
     */
    @Override
    public Map login(User user) throws Exception {
        Map map = new HashMap();map.put("status", 0);
        if(user != null && user.getPhone() !=null &&  user.getPwd() != null){
            user.setPwd(Md5Utils.getMD5Code(user.getPwd()));
            User user1 = userDao.login(user);
            if(user1 != null){
                //更新登录时间以及经纬度
                user1.setLastTime(new Date());user1.setLat(user.getLat());user1.setLng(user.getLng());
                userDao.updateByPrimaryKeySelective(user1);
                //登录后生成token
                String token = Jwts.builder().setSubject(user1.getId())
                        .setAudience(user1.getPwd())
                        .setIssuedAt(new Date())
                        .signWith(SignatureAlgorithm.HS256, "secretkey").compact();
                user1.setToken("Bearer "+token);
                //删除隐私信息
                user1.setPwd(null);
                user1.setLastTime(new Date());
                //保存信息到reids中(有效期7天)
                redisClinet.setExpire("token:Bearer "+token,user1.toString(),3600*24*7L);
                map.put("status", 1);
                map.put("message", user1);
                return map;
            }else {
                //账号或密码错误
                map.put("message","用户名或密码错误。。。");
                logger.error("ERROR====>login:"+user.getPhone()+"==用户名或密码错误,请重试。。。");
                return  map;
            }
        }else {
            //参数为空
            map.put("message","参数存在为空，请重试。。。。");
            logger.error("ERROR====>login:"+user.getPhone()+"==参数存在为空。。。");
            return map;
        }
    }

    /**
     *
     * 更新用户
     * @param user
     * @return
     * @throws Exception
     */
    public Map updateUser(User user, MultipartFile imgFile) throws Exception {
        Map map = new HashMap();map.put("status", 0);
        if (user != null && user.getId() != null) {
            //上传头像
            if (!imgFile.isEmpty()) {
                try {
                    String extensionName = StringUtils.substringAfter(imgFile.getOriginalFilename(), ".");
                    //判断文件格式是否是图片
                    if (!extensionName.toUpperCase().matches("^[(JPG)|(PNG)|(GIF)]+$")) {
                        throw new IndexOutOfBoundsException();
                    }
                    //上传文件
                    String url = QiniuUtils.uploadCloud(imgFile.getInputStream(), UUID.randomUUID().toString().replaceAll("-", "")+  "." + extensionName);
                    user.setImg(url);
                    //删除之前文件，这里就不写了
                } catch (QiniuException e){
                    map.put("message", "上传文件失败");
                    return map;
                }catch (IndexOutOfBoundsException e) {
                    map.put("message","非图片文件，请重试。。。");
                    return  map;
                }
            }
            //评分不给用户修改
            user.setAvgScore(null);
            user.setTag(null);
            userDao.updateByPrimaryKeySelective(user);
            user = userDao.selectByPrimaryPhone(user);
            map.put("status", 1);
            user.setPwd(null);
            map.put("message", user);
        }else {
            map.put("message", "用户id不能为空。。。");
            logger.error("ERROR====>updateUser:"+user.getPhone()+"==用户id不能为空。。。");
        }
        return map;
    }

    /**
     * 获取附近好友
     * @param baseReqBean
     * @return
     */
    @Override
    public Map nearUsers(BaseReqBean baseReqBean) throws  Exception {
        Map map = new HashMap();map.put("status", 0);
        if(baseReqBean !=null && baseReqBean.getId() != null && baseReqBean.getLat() != null && baseReqBean.getLng() != null){
            //获取附近好友
            Double latRange = baseReqBean.getRange()*0.0001;

            Double lngRange = (Double) (baseReqBean.getRange()*0.0001) / 1.1;
            map.put("latRange", latRange);
            map.put("lngRange", lngRange);
            map.put("page", baseReqBean.getPage()-1);
            map.put("size", baseReqBean.getSize());
            map.put("lat", baseReqBean.getLat());
            map.put("lng", baseReqBean.getLng());
            map.put("id", baseReqBean.getId());
            map.put("type", baseReqBean.getType1());

            List<User> users = userDao.nearUserList(map);
            users.parallelStream().forEach(user -> {
                user.setPwd(null);
                user.setPhone((user.getPhone()!= null) ? user.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2") : null);
                user.setUpdateTime(null);
                //计算之间的距离
                user.setDistance(BaiduLocationUtils.getDistance(
                        new LngLat(user.getLng(),user.getLat()),new LngLat(baseReqBean.getLng(),baseReqBean.getLat())
                ));
            });
            Integer total = userDao.nearUserListCount(map);
            map.put("list", users);
            map.put("total", total);
            map.put("status", 1);

        }else {
            map.put("message", "参数值存在为空。。。");
        }
        return map;
    }

    @Override
    public Map isExist(String phone) {
        Map map = new HashMap();map.put("status", 0);
        if(phone != null && PhoneFormatCheckUtils.isPhoneLegal(phone)){
            Integer exist = userDao.isExist(phone);
            if(exist > 0){
                logger.error("ERROR====>isExist:"+phone+"===该手机号已经注册。。。");
                map.put("message", "该手机号已经注册，请重试。。。");
            }else {
                map.put("status", 1);
                map.put("message", "该手机号尚未注册");
            }

        }else {
            map.put("message","请输入合法的手机号。。。" );
            logger.error("ERROR====>isExist:"+phone+"====请输入合法的手机号。。。");
        }

        return  map;
    }

    @Override
    public Map logout(String id,String token) throws Exception {
        Map map = new HashMap();map.put("status", 0);
        if (StringUtils.isEmpty(id) || StringUtils.isEmpty(token)) {
            map.put("message", "参数存在为空");
        }else {
            //判断用户当前用户id与token保持一致
            if(!JwtUtils.isValid(token)) map.put("message", "用户token值有误");
            if (id.equals(JwtUtils.getUserId(token))) {
                //验证成功,删除reids中的token值


                map.put("status", 1);
                map.put("message", "用户退出成功。。。");
            }else {
                map.put("message","退出非当前用户，请重试。。。");
            }
        }
        return map;
    }

    /**
     * 验证码登录
     * @param code
     * @return
     * @throws Exception
     */
    @Override
    public Map dynamicLogin(String code) throws Exception {
        Map map = new HashMap();map.put("status", 0);
        if (StringUtils.isEmpty(code)) {
            map.put("message", "参数code存在为空");
        }else {
            //解析获取其中的手机号

            //查询该该手机号的个人信息



        }
        return map;
    }


}
